#include <stdio.h>

// 之所以增加__cplusplus的宏定义，是为了同时兼容gcc编译器和g++编译器
#ifdef __cplusplus
extern "C"
{
#endif
#include <libavformat/avformat.h>
#include <libavutil/avutil.h>
#ifdef __cplusplus
};
#endif

int main(int argc, char **argv) {
    //默认读取上级目录的fuzhou.mp4文件
    const char *filename = "../fuzhou.mp4";
    if (argc > 1) {
        filename = argv[1];
    }
    //核心对象初始化  创建格式上下文对象，用于存储媒体文件的所有格式相关信息
    AVFormatContext *fmt_ctx = NULL;
    // 打开音视频文件
    // 打开指定媒体文件并解析头部信息
    // 第二个NULL参数表示自动检测文件格式
    // 第三个NULL参数用于指定格式选项
    int ret = avformat_open_input(&fmt_ctx, filename, NULL, NULL);
    //错误处理
    // 使用FFmpeg的日志系统输出错误信息
    // AV_LOG_ERROR表示错误级别日志
    if (ret < 0) {
        av_log(NULL, AV_LOG_ERROR, "Can't open file %s.\n", filename);
        return -1;
    }
    av_log(NULL, AV_LOG_INFO, "Success open input_file %s.\n", filename);
    // 查找音视频文件中的流信息
    // 解析媒体文件中的流数据（视频/音频/字幕等）
    // 获取各流的编解码器参数、时长等信息
    ret = avformat_find_stream_info(fmt_ctx, NULL);
    if (ret < 0) {
        av_log(NULL, AV_LOG_ERROR, "Can't find stream information.\n");
        return -1;
    }
    av_log(NULL, AV_LOG_INFO, "Success find stream information.\n");
    //获取格式信息
    // iformat包含容器格式的详细信息
    // 输出短格式名（如mp4）和长格式名（如MP4 (MPEG-4 Part 14)）
    const AVInputFormat* iformat = fmt_ctx->iformat;
    av_log(NULL, AV_LOG_INFO, "format name is %s.\n", iformat->name);
    av_log(NULL, AV_LOG_INFO, "format long_name is %s\n", iformat->long_name);
    // 关闭音视频文件
    avformat_close_input(&fmt_ctx);
    return 0;
}
/*
lubancat@ubuntu:~/桌面/FFmpeg/chapter02$ g++ read.c -o read -I/usr/local/ffmpeg/include -L/usr/local/ffmpeg/lib -lavformat -lavdevice -lavfilter -lavcodec -lavutil -lswscale -lswresample -lpostproc -lm
lubancat@ubuntu:~/桌面/FFmpeg/chapter02$ ./read ../fuzhou.mp4
Success open input_file ../fuzhou.mp4.
Success find stream information.
format name is mov,mp4,m4a,3gp,3g2,mj2.
format long_name is QuickTime / MOV
*/